Skip to content
本页目录

冒泡排序

规则:

  • 升序:双重循环遍历数组,一边比较一边向后两两交换,将最大值冒泡到末位
  • 降序:双重循环遍历数组,一边比较一边向前两两交换,将最大值冒泡到首位

单向冒泡

JavaScript
const bubbleSort = A => {
  const len = A.length - 1

  for (let i = 0; i < len; i++) {
    let isOk = true
    for (let j = 0; j < len - i; j++) { // 后 i+1 个已排序
      if (A[j] > A[j + 1]) {
        [A[j], A[j + 1]] = [A[j + 1], A[j]]
        isOk = false
      }
    }
    if (isOk) break // 无数据交换时,则说明当前数据已排序完成
  }
}

稳定性:

若将 第7行 代码中的>改为>=,该算法将不再是稳定排序算法!

双向冒泡

JavaScript
const bubbleSort = A => {
  let [l, r] = [0, A.length - 1]

  while (l < r) {
    let isOk = true
    for (let i = l; i < r; i++) { // 前 i+1 个已排序
      if (A[i] > A[i + 1]) { // 将最大值交换值末位
        [A[i], A[i + 1]] = [A[i + 1], A[i]]
        isOk = false
      }
    }
    r-- // 每一趟排序完成,末位已排序数+1,故需收缩未排序区间
    for (let j = r; j > l; j--) { // 后 j 个已排序
      if (A[j] < A[j - 1]) { // 将最小值交换值首位
        [A[j], A[j - 1]] = [A[j - 1], A[j]]
        isOk = false
      }
    }
    l++  // 每一趟排序完成,首位已排序数+1,故需收缩未排序区间
    if (isOk) break // 无数据交换时,则说明当前数据已排序完成
  }
}

稳定性:

若将 第7行 第14行 代码中的>改为>=,该算法将不再是稳定排序算法!

算法应用

leetcode
  1. 剑指 Offer 40. 最小的k个数